package modele;

import java.util.ArrayList;
import java.util.Observable;

import javax.swing.event.EventListenerList;

import controleur.*;
import modele.listener.*;


public class TrainAterrissage extends ObservableGenerique<EtatTrainAterrissageListener> {
	
	/**
	 * Etat logique, rien a voir avec l'interface graphique.
	 */
	public enum Etat{
		FERME,//Haut
		TRANSITIONUP,TRANSITIONDOWN,
		OUVERT//Bas
	}

	private Etat etat;
	
	
	
	public TrainAterrissage(){
		super();
		this.etat=Etat.FERME;
	}
	
	//long counter=0;
	
	/**
	 * Inverse l'etat du train lorsque le pilote actionne la manette (peut importe le sens).
	 */
	public void switcher(){
		
		switch(this.etat){
			case FERME:
				this.etat=Etat.TRANSITIONDOWN;
				break;
			case OUVERT:
				this.etat=Etat.TRANSITIONUP;
			break;
			case TRANSITIONDOWN:
				this.etat=Etat.TRANSITIONUP;
			break;
			case TRANSITIONUP:
				this.etat=Etat.TRANSITIONDOWN;
			break;
		}
		
		fireModeleChanged();
	}
	/**
	 * Timer expired.
	 */
	public void finish(){
		if(this.etat==Etat.TRANSITIONDOWN){
			this.etat=Etat.OUVERT;
		}
		if(this.etat==Etat.TRANSITIONUP){
			this.etat=Etat.FERME;
		}
		
		fireModeleChanged();
	}
	
	public boolean isOuvert(){

		//System.out.println(this.etat);
		if(this.etat==Etat.OUVERT){
			return true;
		}
		else{
			return false;
		}
	}
	public boolean isFerme(){
		if(this.etat==Etat.FERME){
			return true;
		}
		else return false;
	}
	public boolean isDown(){
		if(this.etat==Etat.TRANSITIONDOWN){
			return true;
		}
		else return false;
	}
	public boolean isUp(){
		if(this.etat==Etat.TRANSITIONUP){
			return true;
		}
		else return false;
	}
	public Etat getEtat() {
		return this.etat;
	}
	public boolean isEnTransition(){
		if(isUp() || isDown())
			return true;
		else
			return false;
	}
	
	
	/*
	 * Pour les listeners
	 */
	
	@Override
	public void fireModeleChanged(){
		for(EtatTrainAterrissageListener listener : listenersListe){
			listener.etatChanged(new EtatTrainAterrissageChangedEvent(this, getEtat()));
		}
	}
}
